Handhaving heeft de grootste invloed op misdaad

Handhaving heeft de grootste invloed op misdaad#

Met strengere straffen op illegale activiteiten worden deze minder aantrekkelijk voor potentiële misdadigers. Door de kans om gepakt te worden te vergroten en de gevolgen zwaarder te maken kan een land er voor zorgen dat de mogelijke winsten van misdaad de risico’s niet langer waard zijn, en mensen in plaats hiervan voor legale wegen kiezen om hun lot te verbeteren.

Volgens Petersen et al. (2023) zorgen willekeurige voetgangersstops door politie voor een 11% mindering in misdaad. Door deze stops worden misdaden tegengehouden voordat ze gebeuren en zijn mensen minder geneigd om misdaden te plegen. Meer politie agenten betekent dat dit soort interventies meer kunnen plaatsvinden, wat uiteindelijke misdaadcijfers helpt te bedwingen.

Armere landen ervaren minder misdaden doordat er meer politie agenten zijn#

In figuur 4 is een algemeen positieve trend te zien tussen GDP per capita en de totale criminele activiteit. Dit lijkt te suggereren dat rijke landen meer te kampen hebben met illegale activiteiten dan minder welvarende.

Er is een duidelijke positieve correlatie tussen het GDP per capita en de misdaadcijfers in een land. Dit is te zien in figuur 4. In figuur 6 zien we dat landen met een lage GDP per capita vaker een groter aantal agenten per capita heeft. Deze interpretatie zou het perspectief steunen dat politie belangrijker is dan economische omstandigheden, omdat de werkelijke correlatie met het aantal politieagenten is, niet met de welvaart.

Een andere mogelijke verklaring voor het schijnbare gebrek aan misdaden in landen met een laag GDP per capita, is dat in minder welvarende samenlevingen criminaliteit minder wordt gerapporteerd ondanks het grotere aantal politieagenten. Dit kunnen we niet concluderen uit de gebruikte data, maar vormt een mogelijk punt voor vervolgonderzoek.

Hide code cell source
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np
import plotly.io as pio

pio.renderers.default = 'notebook'

# Load and process data
diefstallenbank1_df = pd.read_csv("world_bank_definitive.csv")
crime_df = pd.read_csv("europe_crime_definitive_per_100k.csv")

bank_df = diefstallenbank1_df[diefstallenbank1_df['Indicator Name'] == "GDP per capita, PPP (constant 2021 international $)"]
bank_df = bank_df.rename(columns={"Value": "GDP per capita, PPP (constant 2021 international $)"})

crime_columns = [col for col in crime_df.columns if col not in ["Country Name", "Year", "geo"]]
crime_df["Total Crime Rate per 100k"] = crime_df[crime_columns].sum(axis=1)

merged_df = pd.merge(
    crime_df[["Country Name", "Year", "Total Crime Rate per 100k"]],
    bank_df[["Country Name", "Year", "GDP per capita, PPP (constant 2021 international $)"]],
    on=["Country Name", "Year"]
)

merged_df = merged_df.loc[merged_df['Year'] == 2018]

# Prepare data for polynomial fit
x = merged_df["GDP per capita, PPP (constant 2021 international $)"]
y = merged_df["Total Crime Rate per 100k"]


# Drop rows with missing or infinite values
filtered_df = merged_df.replace([np.inf, -np.inf], np.nan).dropna(subset=[
    "GDP per capita, PPP (constant 2021 international $)", "Total Crime Rate per 100k"
])

x = filtered_df["GDP per capita, PPP (constant 2021 international $)"]
y = filtered_df["Total Crime Rate per 100k"]
# Fit a 2nd-degree polynomial (quadratic curve)
degree = 2  # you can change this to 3 for a cubic fit
coeffs = np.polyfit(x, y, deg=degree)
poly_func = np.poly1d(coeffs)

# Create x values for the trendline
x_vals = np.linspace(x.min(), x.max(), 500)
y_vals = poly_func(x_vals)

# Plot scatter with curved trendline
fig = px.scatter(
    merged_df,
    x="GDP per capita, PPP (constant 2021 international $)",
    y="Total Crime Rate per 100k",
    hover_name="Country Name",
    hover_data={"Year": False},
    title="GDP per Capita vs. Total Crime Rate per 100k with Curved Trendline",
)

# Add polynomial curve
fig.add_trace(go.Scatter(
    x=x_vals,
    y=y_vals,
    mode='lines',
    name=f'Polynomial Trendline (deg={degree})',
    line=dict(color='red')
))

fig.update_layout(
    xaxis_title="GDP per capita, PPP (constant 2021 international $)",
    yaxis_title="Total Crime Rate per 100k",
    showlegend=False
)


fig.show()

Figuur 4: Het GDP per capita, PPP in 2021 dollars vs het totaal aantal misdaden per land. De data gaat over 2018, maar zelfde patronen zijn te zien in andere jaren. Er is een posiieve correlatie te zien tussen het GDP per capita en criminaliteit tussen 0 en 60.000 dollar. Hierna daalt de correlatie een beetje.

In figuur 5 zien we dat er een correlatie is tussen het aantal politieagenten en het aantal misdaden zoals perspectief 2 voorspelt. Op het eerste gezicht ziet het er inderdaad uit alsof een groter aantal politieagenten zorgt voor minder misdaad. Dit zou het perspectief steunen dat strengere handhaving zorgt voor minder criminaliteit.

Het is belangrijk om op te merken dat in deze visualisatie geen rekening wordt gehouden met andere variabelen die mogelijk invloed hebben op de vertoonde correlatie, zoals vertrouwen in de politie en rechtsstaat, corruptie binnen de politie en de strategie waarmee politie wordt ingezet.

Hide code cell source
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np
import plotly.io as pio

pio.renderers.default = 'notebook'

# Load and process data
police_df = pd.read_csv("europe_justice_per_100k.csv")
crime_df = pd.read_csv("europe_crime_definitive_per_100k.csv")


crime_columns = [col for col in crime_df.columns if col not in ["Country Name", "Year", "geo"]]
crime_df["Total Crime Rate per 100k"] = crime_df[crime_columns].sum(axis=1)

merged_df = pd.merge(
    crime_df[["Country Name", "Year", "Total Crime Rate per 100k"]],
    police_df[["Country Name", "Year", "Police officers"]],
    on=["Country Name", "Year"]
)

merged_df = merged_df.loc[merged_df['Year'] == 2018]

# Prepare data for polynomial fit
x = merged_df["Police officers"]
y = merged_df["Total Crime Rate per 100k"]


# Drop rows with missing or infinite values
filtered_df = merged_df.replace([np.inf, -np.inf], np.nan).dropna(subset=[
    "Police officers", "Total Crime Rate per 100k"
])

x = filtered_df["Police officers"]
y = filtered_df["Total Crime Rate per 100k"]
# Fit a 2nd-degree polynomial (quadratic curve)
degree = 2  # you can change this to 3 for a cubic fit
coeffs = np.polyfit(x, y, deg=degree)
poly_func = np.poly1d(coeffs)

# Create x values for the trendline
x_vals = np.linspace(x.min(), x.max(), 500)
y_vals = poly_func(x_vals)

# Plot scatter with curved trendline
fig = px.scatter(
    merged_df,
    x="Police officers",
    y="Total Crime Rate per 100k",
    hover_name="Country Name",
    hover_data={"Year": True},
    title="Police officers vs. Total Crime Rate per 100k with Curved Trendline"
)

# Add polynomial curve
fig.add_trace(go.Scatter(
    x=x_vals,
    y=y_vals,
    mode='lines',
    name=f'Polynomial Trendline (deg={degree})',
    line=dict(color='red')
))

fig.update_layout(
    xaxis_title="Police officers",
    yaxis_title="Total Crime Rate per 100k",
    showlegend=False
)


fig.show()

Figuur 5: Totale aantal misdaden per 100.000 inwoners is afgezet tegen het aantal politieagenten per 100.000 inwoners. De data gaat over 2018, maar zelfde patronen zijn te zien in andere jaren. Uit deze figuur blijkt dat over het algemeen geldt dat hoe meer politieagenten er zijn, hoe minder misdaden worden gerapporteerd.

Figuur 6 laat zien dat armere landen gemiddeld meer politieagenten per 100.000 inwoners hebben dan rijkere landen, wat op het eerste gezicht onverwacht is. Je zou immers verwachten dat armere landen minder middelen hebben om in politie te investeren. Toch is in Europa een duidelijke trend zichtbaar: naarmate het GDP per capita stijgt, daalt het aantal politieagenten.

Dit kan deels worden verklaard door verschillen in nationaal beleid—sommige landen kiezen bewust voor een grotere politiemacht, ongeacht hun welvaartsniveau. Tegelijkertijd kan het erop wijzen dat armere landen strategisch meer politie inzetten om misdaad te voorkomen of af te schrikken. Hierdoor zou het kunnen dat in sommige armere landen juist minder misdaad voorkomt dan in rijkere landen.

Hide code cell source
import pandas as pd
import plotly.express as px
import plotly.io as pio

pio.renderers.default = 'notebook'

# Load data
bank1_df = pd.read_csv("world_bank_definitive.csv")
police_df = pd.read_csv("europe_justice_per_100k.csv")

# Filter GDP data
bank_df = bank1_df[bank1_df['Indicator Name'] == "GDP per capita, PPP (constant 2021 international $)"]
bank_df = bank_df.rename(columns={"Value": "GDP per capita, PPP (constant 2021 international $)"})

# Merge datasets
merged_df = pd.merge(
    police_df[["Country Name", "Year", "Police officers"]],
    bank_df[["Country Name", "Year", "GDP per capita, PPP (constant 2021 international $)"]],
    on=["Country Name", "Year"]
)

merged_df = merged_df.loc[merged_df['Year'] == 2018]

# Drop missing values
merged_df = merged_df.dropna()

# Compute quartiles with actual bin edges
gdp_series = merged_df["GDP per capita, PPP (constant 2021 international $)"]
quartiles, bins = pd.qcut(gdp_series, q=4, retbins=True, precision=0)

# Format bin labels with ranges
quartile_labels = [
    f"Q1: {int(bins[0]):,}{int(bins[1]):,}",
    f"Q2: {int(bins[1]+1):,}{int(bins[2]):,}",
    f"Q3: {int(bins[2]+1):,}{int(bins[3]):,}",
    f"Q4: {int(bins[3]+1):,}{int(bins[4]):,}"
]

# Assign quartile labels
merged_df['GDP Quartile'] = pd.qcut(
    gdp_series,
    q=4,
    labels=quartile_labels
)

# Define blue gradient colors
color_discrete_map = {
    quartile_labels[0]: "#03DBFC",  # Light blue
    quartile_labels[1]: "#00B4FF",
    quartile_labels[2]: "#006CFF",
    quartile_labels[3]: "#000FFF"   # Dark blue
}

# Create box plot with custom colors and ordered x-axis
fig = px.box(
    merged_df,
    x="GDP Quartile",
    y="Police officers",
    color="GDP Quartile",
    color_discrete_map=color_discrete_map,
    category_orders={"GDP Quartile": quartile_labels},
    title="Police Officers per 100k by GDP per Capita, for each quartile of the data",
    labels={"Police officers": "Police Officers per 100k", "GDP Quartile": "GDP per Capita Quartile"}
)

# Update layout to remove legend (since the x-axis already shows quartiles)
fig.update_layout(showlegend=False)

fig.show()

Figuur 6: Het aantal politie agenten per 100.000 inwoners is afgezet tegenover het GDP per capita, PPP in 2021. De data is opgesplitst in vier kwarten met een gelijke hoeveelheid data, op basis van arm naar rijk. De data gaat over 2018, maar zelfde patronen zijn te zien in andere jaren. Er is een negatieve correlatie te zien tussen het GDP per capita en het aantal politieagenten.